<?php

class Upload {
    private $_boodschap = '';
    private $_lijst = [];
    private $_mimeLijst = [];
    private $_doelmap = [];
    private $_upload = none;
    
    public function upload($uploadVeld='',$mimeLijst='',$map='') {
        if (!isset($_FILES[$uploadVeld]) || !is_uploaded_file($_FILES[$uploadVeld]['tmp_name'])) {
            $this->_boodschap = 'geen bestand ge&uuml;pload';
            return false;
        }
        $this->_upload = $_FILES[$uploadVeld];
        
        if ($this->_uploadFout()) {
            return false;
        }
        
        if (!empty($mimeLijst)) {
            $this->_mimeLijst($mimeLijst);
            if ($this->_bestandMime()) {
                return false;
            }
        }
        
        $this->_doelmap = \Instelling::GET('upload.map').$map;
        
        $bestandsNaam = $this->_bestandsNaam();
        if (move_uploaded_file($this->_upload['tmp_name'], $bestandsNaam)) {
            return $bestandsNaam;
        } else {
            $this->_boodschap = 'verplaatsen ge&euml;pload bestand mislukt';
            return false;
        }
    }
    
    private function _mimeLijst($mimeLijst) {
        if (empty($mimeLijst))
            return;
        
        $mimeLijst = explode(';',$mimeLijst);
        foreach($mimeLijst as $mimeItem) {
            $items = explode(',',$mimeItem);
            $this->_mimeLijst[$items[0]] = $item[1];
        }
    }
    
    private function _uploadFout() {
        switch($this->_upload['error']) {
            case UPLOAD_ERR_INI_SIZE:
                $this->_boodschap = 'bestandsgrootte overtreft toegelaten bestandsgrootte in php.ini';
                return true;
                break;
            case UPLOAD_ERR_FORM_SIZE:
                $this->_boodschap = 'bestandsgrootte overtreft MAX_FILE_SIZE directive van formulier';
                return true;
                break;
            case UPLOAD_ERR_PARTIAL:
                $this->_boodschap = 'bestand niet volledig opgeladen';
                return true;
                break;
            case UPLOAD_ERR_NO_FILE:
                $this->_boodschap = 'er werd geen bestand opgeladen';
                return true;
                break;
            case UPLOAD_ERR_NO_TMP_DIR:
                $this->_boodschap = 'tijdelijke uploadmap ontbreekt';
                return true;
                break;
            case UPLOAD_ERR_CANT_WRITE:
                $this->_boodschap = 'schrijven naar bestand gefaald';
                return true;
                break;
            case UPLOAD_ERR_EXTENSION:
                $this->_boodschap = 'server heeft uploaden onderbroken';
                return true;
                break;
            default:
                return false;
        }
    }
    
    private function _bestandMime() {
        $bestandsType = strtolower($this->_upload['type']);
        $bestandsExtensie = explode('.',$this->_upload['name']);
        $bestandsExtensie = strtolower(end($bestandsExtensie));
        
        if (!array_key_exists($bestandType,$this->_mimeLijst) || $this->_mimeLijst[$bestandsType] != $bestandsExtensie) {
            $this->_boodschap = 'bestandformaat wordt niet ondersteund';
            return false;
        } else {
            return true;
        }
    }
    
    private function _bestandsNaam() {
        $map = ROOT;
        
        $bestandsInfo = pathinfo($this->_upload['name']);
        $bestandsExtensie = '.'.$bestandsInfo['extension'];
        $bestandsNaam = str_replace('/',DIRECTORY_SEPARATOR,$this->_doelmap);
        $bestandsNaam .= $bestandsInfo['filename'];
        $bestandsNaam = str_replace(' ','-',$bestandsNaam);
        $bestandsNaam = str_replace('%20','-',$bestandsNaam);
        $bestand = $bestandsNaam.$bestandsExtensie;        
        $tel = 0;
        
        while(is_file($bestand) || file_exists($map.$bestand)) {
            $bestand = $bestandsNaam.'['.$tel.']'.$bestandsExtensie;
            $tel++;
        }
        
        return $bestand;
    }
    
    public function getBoodschap() {
        return $this->_boodschap();
    }
}
